#include<stdio.h>
#include<stdlib.h>
typedef struct node *tree;
struct node{
	int data;
	int flag;
	tree left;
	tree right;
};
int ttp=0,tp=0,fg=1;
tree reTree(tree t,int m);
void myprint(tree t);
tree reteemirror(tree t,int m);
int main(){
	int n,m;
	tree tr=NULL,trm=NULL;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&m);
		tr=reTree(tr,m);
		trm=reteemirror(trm,m);
	}
	if(ttp==0){//判断搜索树
		printf("YES\n");
		myprint(tr);
	}else if(tp==0){//判断镜子树
		printf("YES\n");
		myprint(trm);
	}else printf("NO\n");
	return 0;
}
//打印后序函数
void myprint(tree t){
	if(t!=NULL){
		myprint(t->left);
		myprint(t->right);
		if(fg==1){
			printf("%d",t->data);
			fg++;
		}else printf(" %d",t->data);
	}
	
}
//还原镜子树
tree reteemirror(tree t,int m){
	if(t==NULL){
		t=(tree)malloc(sizeof(struct node));
		t->left=NULL;
		t->right=NULL;
		t->data=m;
		t->flag=0;
		return t;
	}
	if(t->data <= m && t->flag==0){
		t->left=reteemirror(t->left,m);
	}else{//一旦有了右树枝，就不能在向左树枝插入了，所以有一个flag进行判断
		if(t->data <= m)tp=1;//如果插入的m不符合搜索树的规则就标记
		t->flag=1;
		t->right=reteemirror(t->right,m);
	}
	return t;
}
//还原搜索树
tree reTree(tree t,int m){
	if(t==NULL){
		t=(tree)malloc(sizeof(struct node));
		t->left=NULL;
		t->right=NULL;
		t->data=m;
		t->flag=0;
		return t;
	}
	if(t->data > m && t->flag==0){
		t->left=reTree(t->left,m);
	}else{//一旦有了右树枝，就不能在向左树枝插入了，所以有一个flag进行判断
		if(t->data > m)ttp=1;//如果插入的m不符合二叉树的规则就标记
		t->flag=1;
		t->right=reTree(t->right,m);
	}
	return t;
}
